<?php

/**
 * 建造者模式（复杂对象的组装与创建）
 * 
 * 在软件系统中，有时候面临一个"复杂对象"的创建工作，其通常由各个部分的子对象用一定的算法构成；由于需求的变化，这个
 * 复杂对象的各个部分经常面临这剧烈的变化，但是将它们组合到一起的算法却相对稳定。
 * 如何应对种变化呢？如何提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化，从而保持系统中的"稳定构建算法"不随
 * 需求的改变而改变？
 * 
 * 定义：将一个复杂对象的构建与它的表示相分离，使得同样的构建过程可以创建不同的表示。
 * 
 * 类型：创建型模式
 * 
 * 角色：
 *  1，产品类。
 *  2，抽象建造者。
 *  3，建造者。
 *  4，导演类。
 * 
 * 优点：
 *  1，具有较好的扩展性。
 * 
 * 缺点：
 * 
 */

/**
 * 产品类
 */
class Product
{
	
}

/**
 * 抽象建造者
 */
abstract class Builder
{
	public abstract function buildPartA();
	public abstract function buildPartB();
	public abstract function buildPartC();
	public abstract function getResult();
}

/**
 * 具体建造者
 */
class ConcreteBuilder extends Builder
{
	private $_product;
	
	public function __construct()
	{
		$this->_product = new Product();
	}
	
	public function buildPartA()
	{
		
	}
	
	public function buildPartB()
	{
		
	}
	
	public function buildPartC()
	{
		
	}
	
	public function getResult()
	{
		return $this->_product;
	}
}

class Director
{
	private $_builder;
	
	public function __construct(Builder $builder)
	{
		$this->_builder = $builder;
	}
	
	public function getResult()
	{
		$this->_builder->buildPartA();
		$this->_builder->buildPartB();
		$this->_builder->buildPartC();
		return $this->_builder->getResult();
	}
}

class Client
{
	public static function main()
	{
		$builder = new ConcreteBuilder();
		$director = new Director($builder);
		
		$product = $director->getResult();
	}
}

Client::main();